package cn.apiManager.utils;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;
import java.util.Locale;

import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
 * 日期时间工具类
 * 
 * @author zhouxs
 *
 */
public class DateTimeUtils {
	private static final Logger logger = LoggerFactory
			.getLogger(DateTimeUtils.class);

	// 默认的时间格式
	/**
	 * yyyy-MM-dd
	 */
	public static final String DEFUALT_SHOT_TIME_FORMAT = "yyyy-MM-dd";
	/**
	 * yyyyMMdd
	 */
	public static final String SHOT_DATE_FORMAT = "yyyyMMdd";
	/**
	 * yyyy-MM-dd HH:mm:ss
	 */
	public static final String DEFUALT_LONG_TIME_FORMAT = "yyyy-MM-dd HH:mm:ss";
	/**
	 * HH:mm:ss
	 */
	public static final String LONG_TIME_FORMAT = "HH:mm:ss";
	/**
	 * HHmmss
	 */
	public static final String SHOT_TIME_FORMAT = "HHmmss";
	/**
	 * yyyyMMddHHmmssS
	 */
	public static final String SHOT_TIME_FORMAT_S = "yyyyMMddHHmmssS";

	private DateTimeUtils() {

	}

	/**
	 * 清除小时分钟和秒
	 */
	public static Date clearHourMiniteSecond(Date date) {
		if (date == null) {
			return null;
		}

		Calendar gc = GregorianCalendar.getInstance();
		gc.clear();
		gc.setTime(date);

		gc.set(Calendar.HOUR_OF_DAY, 0);
		gc.set(Calendar.MINUTE, 0);
		gc.set(Calendar.SECOND, 0);
		gc.set(Calendar.MILLISECOND, 0);

		return gc.getTime();
	}

	/**
	 * 按照指定格式返回当前时间，如果格式为空，则默认为yyyyMMddHHmmssS
	 * 
	 * @param dateFormat
	 * @return
	 */
	public static String getCurrentDateToLongString(String dateFormat) {
		if (StringUtils.isBlank(dateFormat)) {
			dateFormat = SHOT_TIME_FORMAT_S;
		}

		SimpleDateFormat sdf = new SimpleDateFormat(dateFormat);
		return sdf.format(getCurrentDate());
	}

	/**
	 * 按照指定格式返回当前时间，如果格式为空，则默认为yyyy-MM-dd
	 * 
	 * @param dateFormat
	 * @return
	 */
	public static String getCurrentDateToString(String dateFormat) {
		if (StringUtils.isBlank(dateFormat)) {
			dateFormat = DEFUALT_SHOT_TIME_FORMAT;
		}

		SimpleDateFormat sdf = new SimpleDateFormat(dateFormat);
		return sdf.format(getCurrentDate());
	}

	/**
	 * 按照指定格式返回当前时间，如果格式为空，则默认为yyyy-MM-dd
	 * 
	 * @param dateFormat
	 * @return
	 */
	public static Date stringFormatToDate(String date, String dateFormat) {
		if (date == null) {
			return null;
		}

		if (StringUtils.isBlank(dateFormat)) {
			if (date.length() > 10) {
				dateFormat = DEFUALT_LONG_TIME_FORMAT;
			} else {
				dateFormat = DEFUALT_SHOT_TIME_FORMAT;
			}
		}

		try {
			SimpleDateFormat sdf = new SimpleDateFormat(dateFormat);
			return sdf.parse(date);
		} catch (Exception e) {
			logger.info("INFO", e);
			return null;
		}
	}

	/**
	 * 格式化日期输出，如果格式为空，则默认为yyyy-MM-dd
	 * 
	 * @param date
	 * @param dateFormat
	 * @return
	 */
	public static String dateToStringFormat(Date date, String dateFormat) {
		if (date == null) {
			return "";
		}

		if (StringUtils.isBlank(dateFormat)) {
			dateFormat = DEFUALT_SHOT_TIME_FORMAT;
		}

		try {
			SimpleDateFormat sdf = new SimpleDateFormat(dateFormat);
			return sdf.format(date);
		} catch (Exception e) {
			logger.info("INFO", e);
			return null;
		}
	}

	/**
	 * 得到当前时间
	 * 
	 * @return
	 */
	public static Date getCurrentDate() {
		return new Date();
	}

	/**
	 * 比较两个时间的间隔，单位为毫秒
	 * 
	 * @param endDate
	 * @param startDate
	 * @return
	 */
	public static int diffTwoDateWithTime(Date endDate, Date startDate) {
		if (startDate == null || endDate == null) {
			return -1;
		}
		int diff = (int) (endDate.getTime() - startDate.getTime());

		return diff;
	}

	/**
	 * 比较两个时间的间隔，单位为小时
	 * 
	 * @param startDate
	 * @param endDate
	 * @return
	 */
	public static int diffTwoDateWithHour(Date startDate, Date endDate) {
		return (int) ((endDate.getTime() - startDate.getTime())
				/ (60 * 60 * 1000) + 1);
	}

	/**
	 * 比较两个时间的间隔，单位为天
	 * 
	 * @param startDate
	 * @param endDate
	 * @return
	 */
	public static int diffTwoDateWithDay(Date startDate, Date endDate) {
		return (int) ((endDate.getTime() - startDate.getTime())
				/ (24 * 60 * 60 * 1000) + 1);
	}

	/**
	 * 时间增加一天Calendar的使用
	 * 
	 * @param s
	 * @param n
	 * @return
	 */
	public static String addDate(String s, int n) {
		try {
			SimpleDateFormat sdf = new SimpleDateFormat(SHOT_DATE_FORMAT);

			Calendar cd = Calendar.getInstance();
			cd.setTime(sdf.parse(s));
			cd.add(Calendar.DATE, n);// 增加一天
			// cd.add(Calendar.MONTH, n);//增加一个月
			return sdf.format(cd.getTime());
		} catch (Exception e) {
			logger.info("INFO", e);
			return null;
		}
	}

	/**
	 * 日期处理
	 * 
	 * @param srcDate
	 *            原日期
	 * @param days
	 *            增加的天数
	 * @param minutes
	 *            增加的分钟数
	 * @param seconds
	 *            增加的秒数
	 * @return
	 */
	public static Date addDate(Date srcDate, int days, int minutes, int seconds) {
		Calendar c = Calendar.getInstance();
		c.setTime(srcDate);
		if (days != 0) {
			c.add(Calendar.DATE, days);
		}
		if (minutes != 0) {
			c.add(Calendar.MINUTE, minutes);
		}
		if (seconds != 0) {
			c.add(Calendar.SECOND, seconds);
		}
		return c.getTime();
	}

	public static String getWeekOfDate(Date dt) {
		String[] weekDays = { "星期日", "星期一", "星期二", "星期三", "星期四", "星期五", "星期六" };
		Calendar cal = Calendar.getInstance();
		cal.setTime(dt);
		int w = cal.get(Calendar.DAY_OF_WEEK) - 1;
		if (w < 0)
			w = 0;
		return weekDays[w];
	}

	/**
	 * 获取当前月份的天数
	 * 
	 * @return
	 */
	public static int getDayOfMonth() {
		Calendar aCalendar = Calendar.getInstance(Locale.CHINA);
		int day = aCalendar.getActualMaximum(Calendar.DATE);
		return day;
	}

	/**
	 * 获取当前的月份获取当月的天数
	 * 
	 * @return
	 */
	public static int getDayOfMonths(String date) {
		Calendar cal = new GregorianCalendar();
		// 或者用Calendar cal = Calendar.getInstance();

		/** 设置date **/
		SimpleDateFormat oSdf = new SimpleDateFormat("", Locale.ENGLISH);
		oSdf.applyPattern("yyy-MM");
		try {
			cal.setTime(oSdf.parse(date));
		} catch (ParseException e) {
			e.printStackTrace();
		}

		/** 或者设置月份，注意月是从0开始计数的，所以用实际的月份-1才是你要的月份 **/
		// 一月份: cal.set( 2009, 1-1, 1 );

		/** 如果要获取上个月的 **/
		// cal.set(Calendar.DAY_OF_MONTH, 1);
		// 日期减一,取得上月最后一天时间对象
		// cal.add(Calendar.DAY_OF_MONTH, -1);
		// 输出上月最后一天日期
		// System.out.println(cal.get(Calendar.DAY_OF_MONTH));
		/** 开始用的这个方法获取月的最大天数，总是得到是31天 **/
		// int num = cal.getMaximum(Calendar.DAY_OF_MONTH);
		/** 开始用的这个方法获取实际月的最大天数 **/
		int num2 = cal.getActualMaximum(Calendar.DAY_OF_MONTH);
		return num2;
	}
	
	/**
	 * 获取今天的日期
	 * @return
	 */
	public static int dayOfMonth(){
		Calendar cal=Calendar.getInstance(); 
		return cal.get(Calendar.DATE);   
	}
	
	/**
	 * 格式化  10月15日
	 * @return
	 */
	public static String MonthAndDay(Date date){
		  SimpleDateFormat sdfInput = new SimpleDateFormat("MM月dd日");
		  Calendar calendar = Calendar.getInstance();
		  calendar.setTime(date);
		return sdfInput.format(date);   
	}

//	public static void main(String[] args) {
//		Date date = DateTimeUtils.stringFormatToDate("2010-01-01", DateTimeUtils.DEFUALT_SHOT_TIME_FORMAT);
//		System.out.println(DateTimeUtils.diffTwoDateWithDay(new Date(), date));
//		System.out.println(DateTimeUtils.dayOfMonth());
//		System.out.println(DateTimeUtils.MonthAndDay(new Date()));
//	}
}
